home *** CD-ROM | disk | FTP | other *** search
- bbs> Msg# 28131 To: ATARI @ALLE From: DC1EX Date: 23Oct89/0925
- Subject: SAT-BERECHNUNG IN GFA2.0
- Bulletin ID: 22A90CDB0GV
- Path: DB0AAA!DB0CZ!DB0GV
- de DC1EX @ DB0GV
-
- Hallo OM's
-
- Für alle diejenigen, die gerne ein Satelliten-Programm schreiben
- möchten, wo es aber am geeigneten Algorithmus scheitert seien
- folgende Routinen. Sie stellen den Grundstock für ein Programm
- dar. Die Routinen dürften weitestgehend selbstdokumentierend
- sein. Vielleicht setzt sich ja mal jemand hin, schreibt ein
- brauchbares Sat-Programm und veröffentlicht es als Public-Domain.
-
- Der Algorithmus wurde in Amsat DL 1/89 abgedruckt und stammt von
- DJ1YQ. Ich habe ihn dann an Gfa-Basic 2.0 angepasst.
-
- Die Routine ist was die Rechenzeit anbetrifft noch nicht optimal.
- Es läβt sich noch eine Geschwindigkeitssteigerung von etwa 30%
- erzielen. Aus Gründen der Übersichtlichkeit habe ich mich jedoch
- für die langsamere Variante entschieden.
-
- Die Routinen im einzelnen:
-
- INIT :
- Initialisierung der Array's und Konstanten
-
- START_SAT:
- Berechnung einiger Konstanten aus den Keplerdaten.
- Die Daten ändern sich nicht in Abhängigkeit von der Zeit, die
- Routine muβ also nur einmal pro Satellit aufgerufen werden.
-
- CALC_DEZ_TIME:
- Berechnet aus Datum und Uhrzeit die entsprechende Dezimalzeit.
-
- CALC_POSITION:
- Die eigentliche Berechnung der Bahnpunkte. Die Variablennamen
- wurden so gewählt, daβ sie möglichst selbsterklärend sind.
-
- Ich hoffe die Erklärungen sind ausreichend. Falls Probleme
- auftreten, so stehe ich für Rückfragen gerne zu Verfügung.
- Ansonsten wünsche ich viel Spaβ beim Programmieren.
-
- 73 de Ecki, DC1EX @ DB0GV
-
-
-
-
- ' Sat-Routinen für Gfa-Basic 2.0
- ' DC1EX 1989
- '
- ' Quelle : Amsat DL 1/89, DJ1YQ
- '
- '
- DEFFN arccos(x)=PI/2-ATN(x/SQR(1-x*x))
- DEFFN arcsin(x)=ATN(x/SQR(1-x*x))
- '
- PROCEDURE init
- az_sat=10 !Anzahl Satelliten
- '
- ' Array's für Keplerdaten
- '
- DIM sat$(az_sat),epoch_time(az_sat),inclination(az_sat)
- DIM raan(az_sat),eccentricity(az_sat),arg_of_perigee(az_sat)
- DIM mean_anomaly(az_sat),mean_motion(az_sat),decay_rate(az_sat)
- DIM epoch_rev(az_sat),epoch_year(az_sat),offset(az_sat)
- '
- ' Array's für Zwischenergebnisse
- '
- DIM rev_time(az_sat),semi_major_axis(az_sat)
- DIM delta_omega_ell(az_sat),et_day_per(az_sat)
- DIM delta_omega_eb(az_sat)
- DIM gsw(az_sat),eqx_per(az_sat),et_day_akt(az_sat)
- DIM delta_umlauf(az_sat),omega_akt(az_sat)
- DIM et_day_per_akt(az_sat),eqx_per_akt(az_sat)
- '
- ' Array's für Ergebnisse
- '
- DIM u_akt(az_sat),m_a_akt(az_sat),w_a(az_sat)
- DIM r(az_sat),distance(az_sat),t0(az_sat)
- DIM eqx(az_sat),ssp_b(az_sat),ssp_l(az_sat)
- DIM elevation(az_sat),azimut(az_sat)
- DIM qth_sat(az_sat)
- '
- ' Konstanten
- '
- erd_radius=6371
- drehung_tag=360.985647
- rad=PI/180
- grad=180/PI
- '
- ' Geographische Länge und Breite des Qth's
- '
- l_qth=353.2
- b_qth=51.6
- '
- ' Keplerdaten
- '
- sat$(1)="Oscar 13"
- epoch_time(1)=88243.213934
- inclination(1)=57.57
- raan(1)=241.37
- eccentricity(1)=0.65629
- arg_of_perigee(1)=189.76
- mean_anomaly(1)=145.226
- mean_motion(1)=2.09702315
- decay_rate(1)=0
- epoch_rev(1)=161
- RETURN
- '
- ' Berechnung einiger Bahnkonstanten
- ' Aufruf nur einmal erforderlich
- '
- PROCEDURE start_sat(sat)
- '
- ' Umlaufzeit
- '
- rev_time(sat)=1440/mean_motion(sat)
- '
- ' Groβe Halbachse
- '
- semi_major_axis(sat)=(rev_time(sat)*rev_time(sat)*36.4085*1000000)^(1/3)
- '
- ' Drehung der Bahnellipse (Grad pro Umlauf)
- '
- delta_omega_ell(sat)=5*(5*COS((inclination(sat))*rad)^2-1)/((semi_major_axis(sat)/erd_radius)^(3.5)*(1-eccentricity(sat)^2)^2*mean_motion(sat))
- '
- ' Drehung der Bahnebene (Grad pro Umlauf)
- '
- delta_omega_eb(sat)=-9.98*COS(inclination(sat)*rad)/((semi_major_axis(sat)/erd_radius)^3.5*(1-eccentricity(sat)^2)^2*mean_motion(sat))
- '
- ' Referenz-perigäums-epoch-time
- '
- epoch_year(sat)=INT(epoch_time(sat)/1000)
- et_day_per(sat)=epoch_time(sat)-epoch_year(sat)*1000-mean_anomaly(sat)/(360*mean_motion(sat))
- '
- ' Greenwich Stundenwinkel
- '
- offset(sat)=101
- FOR i%=85 TO epoch_year(sat)-1
- ADD offset(sat),365
- IF (i% MOD 4)=0
- INC offset(sat)
- ENDIF
- NEXT i%
- '
- days=offset(sat)+et_day_per(sat)
- ' gsw(sat)=0.9972685185*INT(days)+drehung_tag*(days-INT(days))
- gsw(sat)=0.985647*INT(days)+drehung_tag*(days-INT(days))
- gsw(sat)=gsw(sat) MOD 360
- '
- ' Referenz-Äquatorcrossing
- '
- eqx_per(sat)=gsw(sat)-raan(sat)
- '
- RETURN
- '
- ' Aktuelle Position des Satelliten
- '
- PROCEDURE calc_position(sat,dez_time)
- '
- ' Zuwachs an Umläufen
- '
- delta_umlauf(sat)=INT((dez_time-et_day_per(sat))*mean_motion(sat))
- '
- ' Zuwachs des Arg. of Perigee
- '
- omega_akt(sat)=arg_of_perigee(sat)+delta_omega_ell(sat)*delta_umlauf(sat)
- '
- ' Aktualisieren der Referenz Perigäums ET
- '
- et_day_per_akt(sat)=et_day_per(sat)+delta_umlauf(sat)/mean_motion(sat)
- '
- ' Aktualisieren des Referenz-EQX
- '
- eqx_per_akt(sat)=eqx_per(sat)+delta_umlauf(sat)*(drehung_tag/mean_motion(sat)-delta_omega_eb(sat))
- eqx_per_akt(sat)=eqx_per_akt(sat) MOD 360
- '
- ' Aktueller Orbit
- '
- u_akt(sat)=epoch_rev(sat)+delta_umlauf(sat)
- '
- ' MA
- '
- t=(dez_time-et_day_per_akt(sat))*1440
- m_a_akt(sat)=INT(256*t/rev_time(sat))
- '
- ' Wahre Anomalie
- '
- z=2*PI*t/rev_time(sat)
- e_a=z
- REPEAT
- z3=(e_a-eccentricity(sat)*SIN(e_a)-z)/(1-eccentricity(sat)*COS(e_a))
- SUB e_a,z3
- UNTIL ABS(z3)<1.0E-07
- w_a(sat)=PI
- IF e_a<>PI
- w_a(sat)=2*ATN(SQR((1+eccentricity(sat))/(1-eccentricity(sat)))*TAN(e_a/2))
- IF e_a>=PI
- w_a(sat)=2*PI+w_a(sat)
- ENDIF
- ENDIF
- w_a(sat)=w_a(sat)*360/(2*PI)
- '
- ' Entfernung Sat-Geozentrum
- '
- r(sat)=semi_major_axis(sat)*(1-eccentricity(sat)^2)/(1+eccentricity(sat)*COS(w_a(sat)*rad))
- '
- ' Aussichtsweite
- '
- distance(sat)=erd_radius*ATN(SQR(r(sat)^2-erd_radius^2)/erd_radius)
- '
- ' Zeit Perigäum-EQX
- '
- e0=(eccentricity(sat)+COS(omega_akt(sat)*rad))/(1+eccentricity(sat)*COS(omega_akt(sat)*rad))
- e0=FN arccos(e0)*grad
- t0(sat)=(e0*rad-eccentricity(sat)*SIN(e0*rad))*rev_time(sat)/(2*PI)
- '
- ' EQX
- '
- eqx(sat)=eqx_per_akt(sat)+drehung_tag*t0(sat)/1440
- '
- ' Ssp.b
- '
- ssp_b(sat)=FN arcsin(SIN(inclination(sat)*rad)*SIN((omega_akt(sat)+w_a(sat))*rad))*grad
- '
- ' Ssp.l
- '
- IF (ssp_b(sat)<0 AND inclination(sat)<90) OR (ssp_b(sat)>=0 AND inclination(sat)>=90)
- ssp_l(sat)=eqx(sat)+(t-t0(sat))/4+FN arccos(COS((omega_akt(sat)+w_a(sat))*rad)/COS(ssp_b(sat)*rad))*grad
- ELSE
- ssp_l(sat)=eqx(sat)+(t-t0(sat))/4-FN arccos(COS((omega_akt(sat)+w_a(sat))*rad)/COS(ssp_b(sat)*rad))*grad
- ENDIF
- ssp_l(sat)=ssp_l(sat) MOD 360
- IF ssp_l(sat)<0
- ADD ssp_l(sat),360
- ENDIF
- '
- ' Elevation
- '
- sx=FN arccos((SIN(ssp_b(sat)*rad)*SIN(b_qth*rad)+COS(ssp_b(sat)*rad)*COS(b_qth*rad)*COS((ssp_l(sat)-l_qth)*rad)))
- elevation(sat)=ATN((COS(sx)-erd_radius/r(sat))/SIN(sx))*grad
- '
- ' Azimut
- '
- azimut(sat)=FN arccos((SIN(ssp_b(sat)*rad)-SIN(b_qth*rad)*COS(sx))/(COS(b_qth*rad)*SIN(sx)))*grad
- IF (ssp_l(sat)-l_qth)>=0 OR (ssp_l(sat)-l_qth)<-180
- azimut(sat)=360-azimut(sat)
- ENDIF
- '
- ' Entferung Qth-Sat
- '
- qth_sat(sat)=r(sat)*SIN(sx)/COS(elevation(sat)*rad)
- RETURN
- '
- ' Umrechnung von Datum und Uhrzeit in Dezimalzeit
- '
- PROCEDURE calc_dez_time(datum$,uhrzeit$)
- LOCAL day,month,year
- day=VAL(LEFT$(datum$,2))
- month=VAL(MID$(datum$,4,2))
- year=VAL(RIGHT$(datum$,2))
- '
- dez_time=INT(30.55*(month+2))-2*(INT(0.1*(month+7)))-91
- IF month>2
- IF (year MOD 4)=0
- INC dez_time
- ENDIF
- ENDIF
- ADD dez_time,day
- '
- ADD dez_time,VAL(LEFT$(uhrzeit$,2))/24
- ADD dez_time,VAL(MID$(uhrzeit$,4,2))/1440
- ADD dez_time,VAL(RIGHT$(uhrzeit$,2))/86400
- RETURN
-
-